#include <cstddef>
#include <utility>
#include <vector>
#include <iostream>

// 实现两个比较器
template<class T> 
class Less {
    public: 
        bool operator()(const T& x, const T& y) {
            return x < y;
        }
};

template<class T>
class Greater {
    public:
        bool operator()(const T& x, const T& y) {
            return x < y;
        }
};

namespace xywl {
    template<class T, class Container = std::vector<T>, class Compare = Less<T>>
    class priority_queue {
        public:
            void push(const T& x) {
                _con.push_back(x);
                AdjustUp(_con.size() - 1);
            }
            void AdjustDown(int parent) {
                Compare com;
                int child = (parent * 2) + 1; // 先假设是左孩子
                while(child < _con.size()) {
                    if(child + 1 < _con.size() && com(_con[child], _con[child + 1])) // 如果是右孩子比左孩子大就将孩子设置为右孩子
                    {
                        child++;
                    }
                    if(com(_con[parent], _con[child])) {
                        std::swap(_con[parent], _con[child]);
                    }else {
                        break;
                    }
                }
            }
            void pop() {
                std::swap(_con[0], _con[_con.size() - 1]);
                _con.pop_back();
                AdjustDown(0);
            }
            const T& top() {
                return _con[0];
            }
            size_t size() const {
                return _con.size();
            }
            bool empty() const {
                return _con.empty();
            }
        private:
            Container _con;
    };
}